#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <errno.h>

int main() {
    // 定义描述符集合
    fd_set rfds;
    int maxfd = 1;
    // 定义事件结构
    struct timeval tv = {.tv_sec = 3, .tv_usec = 0};

    while (1) {
        // 清空描述符集合
        FD_ZERO(&rfds);
        // 将描述符添加到集合中
        FD_SET(0, &rfds);
        // 重置超时时间
        tv.tv_sec = 3;
        tv.tv_usec = 0;

        // select(maxfd,rfds,wfds,efds,tv)
        int ret = select(maxfd, &rfds, NULL, NULL, &tv);
        if (ret < 0) {
            perror("select error");
            if (errno == EINTR) {
                continue;
            }
            return -1;
        } else if (ret == 0) {
            printf("select timeout!\n");
            continue;
        }

        // 从0号描述符开始到最大逐个判断
        for (int i = 0; i < maxfd; ++i) {
            if (FD_ISSET(i, &rfds)) {
                char buf[1024] = {0};
                int res = read(i, buf, 1023);
                if (res < 0) {
                    perror("read error");
                    return -1;
                } else if (res > 0) {
                    // 处理读取的数据，这里简单输出
                    printf("Read data: %s", buf);
                }
            }
        }
    }
    return 0;
}